/**************************************************************************************** Import */
import _ from 'lodash';
import React, {Component} from 'react';
import { DeviceEventEmitter } from 'react-native';
import HttpHesq from '../system/basis/http/trans';
import Storage from '../system/basis/storage';
import Session from '../system/basis/session';
import Arrive from '../system/arrive';
import EVENT from '../../../config/map/event';

/**************************************************************************************** Page */
export default class PageBase extends Component {
    constructor(props) {
        super(props);

        // 设置路由对象（react-naviation）
        this.nav = this.props.navigation;

        // 设置场景（取自本对象和配置对象的组合）
        this.scene = null;

        // 注册回退事件
        this.backevent = DeviceEventEmitter.addListener(EVENT.back, (value)=> {
            if (_.isFunction(this.componentDidBack)) {
                this.componentDidBack(value);
            }
        });
    }

    /************************************************************************************ Life */
    // 卸载时，删除监听对象
    componentWillUnmount() {
        this.backevent.remove();
    }

    /************************************************************************************ PageLoad */
    // pageload调起函数
    pageload(param) {

        // 验证
        if (!this._validFunction(this.logic.pageload)) return;
        if (!this._validSuccessScene()) return;

        // 取回set
        const set = this.logic.pageload(param);

        // 初始化scene对象
        this._setScene(set);

        // 注意：如果没有进行过arrive，自动调起arriveload
        // 注意：否则仅仅调用pageload
        if (Arrive.isArrived()) this._httpPageload(set);
        else {
            Storage.set('system_user_sign', {
                token: '64b47881c5aa34a5',
                uid: 1
            }, ()=> {
                this.arriveload(set); 
            });
        }
    }

    // 当set.arrive等于true时的
    arriveload(set) {

        /**
         * 一、进行Power.arrive调用，初始化用户和http环境（注意：一定要用回调方法进行后面的处理，否则很可能会造成多线程取值出现问题）
         * 二、访问arrive服务端地址，让服务端添加session（遵守pageload的管道）
         * 三、访问arrive成功后，进行页面加载
         */
        Arrive.arrive(()=> {
            HttpHesq.get({

                // 定义page为this，设置url，没有data
                page: this,
                url: 'page/arrive/visit.php',
    
                // 注意：在此方法中，对sign进行相关处理之后，继续加载页面
                // 注意：去除set.start和set.end，再调用pageload，否则两个http的start和end会相互影响
                success: (sign, obj)=> {
                    
                    // 刷新sign
                    Arrive.arrived(sign);

                    // 去除set的start和end
                    set = _.omit(set, ['start', 'end']);
                    set.pipe = _.omit(set.pipe, ['start', 'end']);
                    
                    // 调用pageload
                    this._httpPageload(set);
                },
    
                // 设置pipe
                pipe: set.pipe
            });
        });
    }

    /************************************************************************************ BackLoad */
    cacheload(param) {

        // 验证
        if (!this._validFunction(this.logic.cacheload)) return;
        if (!this._validSuccessScene()) return;

        // 从this.logic.cacheload取回set。从session中取回data
        const set = this.logic.cacheload(param);
        const data = Session.get('preload');

        // 初始化scene对象
        this._setScene(set);

        // 设置data和场景
        this.setState({
            data: data
            }, ()=> {

                // 带有empty函数时，测试数据是否为空，如果为空，则使用empty场景
                if (_.isFunction(set.empty) && set.empty(data)) {
                    obj.page.setState({
                        scene: this.scene.empty
                    });
                    console.log('Cacheload：空数据（empty）');
                    return;
                }

                // 否则，直接指定为success场景
                this.setState({ scene: this.scene.success });
                console.log('Cacheload：成功（success）');
            }
        );
    }

    /************************************************************************************ PreLoad */
    preload(key, param) {

        // 验证
        if (!this._validFunction(this.logic.preload[key])) return;

        // 取回set
        const set = this.logic.preload[key](param);

        // 取变量，访问
        HttpHesq.get({

            // 设置obj对象中的page, to, param。否则管道接收不到
            page: this,
            to: set.to,
            param: set.param,

            // 设置url和data
            url: set.url,
            data: set.data,

            // 成功方法
            success: (data, obj)=> {

                // 存储session，并跳转
                Session.set('preload', data);
                this.nav.navigate(set.to, set.param);
                console.log('Preload：成功（success）');
            },

            // 设置pipe
            pipe: set.pipe
        });
    }

    /************************************************************************************ SaveBack */
    back(value) {
        this.nav.goBack();
        DeviceEventEmitter.emit(EVENT.back, value);
    }

    /************************************************************************************ Func */
    // setScene
    _setScene(set) {
        this.scene = set.scene;
        this.scene.success = this.$success;
        if (_.isFunction(this.$loading)) this.scene.loading = this.$loading;
        if (_.isFunction(this.$empty)) this.scene.empty = this.$empty;
        if (_.isFunction(this.$error)) this.scene.error = this.$error;
        if (_.isFunction(this.$offline)) this.scene.offline = this.$offline;
    }

    // 验证参数是否为存在的函数
    _validFunction(func) {
        if (!_.isFunction(func)) {
            console.error('this.logic' + func.name + '不存在，或不是函数！');
            return false;
        }
        return true;
    }

    // 验证success场景是否存在
    _validSuccessScene() {
        if (!this.$success) {
            console.error('使用arriveload、pageload、cacheload加载页面时，必须存在this.$success方法（用于加载正确状态下的渲染页面）！');
            return false;
        }
        return true;
    }

    // 页面加载以及管道、场景的实际操作方法（主要用于arrive和正常情况下的pageload）
    _httpPageload(set) {

        // 访问http
        HttpHesq.get({

            // 定义page为this，设置url和data
            page: this,
            url: set.url,
            data: set.data,

            // 成功方法
            success: (data, obj)=> {
                console.log(data);
                // 设置data和场景
                this.setState({
                    data: data
                    }, ()=> {

                        // 带有empty函数时，测试数据是否为空，如果为空，则使用empty场景
                        if (_.isFunction(set.empty) && set.empty(data)) {
                            this.setState({
                                scene: this.scene.empty
                            });
                            console.log('Pageload：空数据（empty）');
                            return;
                        }

                        // 否则，直接指定为success场景
                        this.setState({ scene: this.scene.success });
                        console.log('Pageload：成功（success）');
                    }
                );
            },
            
            // 设置pipe
            pipe: set.pipe
        });
    }
}
